package dbutils02;

import org.apache.commons.dbutils.BasicRowProcessor;
import org.apache.commons.dbutils.BeanProcessor;
import org.apache.commons.dbutils.GenerousBeanProcessor;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.junit.Before;
import org.junit.Test;

import java.sql.SQLException;
import java.util.HashMap;

/**
 * 利用DBUtils做查询操作
 * QueryRunner类中
 *      <T>  T	query(String sql, ResultSetHandler<T> rsh, Object... params)
 *          String sql：传入一个预编译的sql语句
 *          ResultSetHandler<T> rs：传入ResultSetHandler接口不同的实现类来实现不同数据封装
 *          params：指定预编译SQL中占位符的值
 *   ResultSetHandler的实现类:
 *      BeanHandler：将查询结果集中的第一行(第一条记录)封装到一个指定的JavaBean中
 *                  JavaBean:含有空参构造,以及getter/setter方法的Java类
 *              BeanHandler(Class<? extends T> type):传入封装数据对应的JavaBean
 *              BeanHandler(Class<? extends T> type, RowProcessor convert):传入封装数据对应的JavaBean,在传入一个转换器
 *                  BasicRowProcessor类(RowProcessor接口实现类)中构造方法:
 *                          BasicRowProcessor(BeanProcessor convert)
 *                    BeanProcessor类构造方法:
 *                      BeanProcessor(Map<String,String> columnToPropertyOverrides):Map<String,String>建立表中列名和类中字段名映射关系
 *                   GenerousBeanProcessor类:
 *                     如果列名和Java类中的字段名除了_其它字符都一致(不区分大小写),我们可以直接用GenerousBeanProcessor转换器,不需要建立映射关系
 *      BeanListHandler:
 *      MapHandler:
 *      MapListHandler:
 *      ScalarHandler:
 */
public class DBUtilsDemo03 {
    private QueryRunner qr;

    @Before
    public void initQueryRunner(){
        //先初始化QueryRunner对象
        qr = new QueryRunner(JDBCUtils.getDataSource());
    }

    @Test
    public void testBeanHander() throws SQLException {
        //查询商品编号为8的商品信息
        /*
         *  1.底层会拼接预编译SQL,将拼接好的SQL发送到数据库执行
         *     SELECT * FROM product WHERE pid=8
         *  2.将查询结果集的第一行数据通过对应的JavaBean的setter方法封装到对象中
         *  3.返回该对象
         */
        Product p = qr.query("SELECT * FROM product WHERE pid= ?",
                new BeanHandler<Product>(Product.class),
                8);

        System.out.println(p);
    }

    @Test
    public void testBeanHander02() throws SQLException {
        //建立表中列名和类中字段映射关系
        HashMap<String, String> colField = new HashMap<>();
        colField.put("cid", "cid_1");

        //查询商品编号为8的商品信息
        Product p = qr.query("SELECT * FROM product WHERE pid= ?",
                new BeanHandler<Product>(Product.class, new BasicRowProcessor(new BeanProcessor(colField))),
                8);

        System.out.println(p);
    }

    @Test
    public void testBeanHander03() throws SQLException {
        //查询商品编号为8的商品信息
        Product p = qr.query("SELECT * FROM product WHERE pid= ?",
                new BeanHandler<Product>(Product.class, new BasicRowProcessor(new GenerousBeanProcessor())),
                8);

        System.out.println(p);
    }
}
